package com.study.kt._02feature

fun main() {

    // 1.外部定义函数使用其引用
    println(num1AndNum2(1, 2, ::plus))

    // 2.使用匿名函数
    println(num1AndNum2(2, 1, fun(num1: Int, num2: Int): Int {
        return num1 - num2
    }))

    // 3.使用lambda表达式
    println(num1AndNum2(2, 2) { num1: Int, num2: Int ->
        num1 * num2
    })

    // 查找集合指定元素
    // 官方扩展
    val list = listOf("fauks", "slx", "jaychou", "mg")
    list.forEach { println(it.first()) }
    println(list.maxByOrNull { it.length })

    println(list.findMax {
        it.first()
    })

}

// 高阶函数自定义maxby
fun <T, R : Comparable<R>> List<T>.findMax(block: (T) -> R): T? {
    if (isEmpty()) return null
    // 假设第一个为最大
    var maxElement: T = get(0)
    // 将T按照自定义规则转换为可比较类型
    var maxValue: R = block(maxElement)
    // 比较条件(字母顺序、长度等 自定义的block规则)
    for (element in this) {
        val value: R = block(element)
        if (value > maxValue) {
            maxElement = element
            maxValue = value
        }
    }
    return maxElement
}

fun plus(num1: Int, num2: Int): Int {
    return num1 + num2
}

fun num1AndNum2(num1: Int, num2: Int, operator: (Int, Int) -> Int): Int {
    return operator(num1, num2)
}